package hwThree2;

import edu.princeton.cs.algs4.BST;
import edu.princeton.cs.algs4.StdOut;

// 作业 3.2.10
public class TestBST {
    public static void main(String[] args) {
        // 创建一个BST实例
        BST<String, Integer> bst = new BST<>();

        // 插入一些键值对到BST中
        bst.put("S", 1);
        bst.put("E", 2);
        bst.put("A", 3);
        bst.put("R", 4);
        bst.put("C", 5);
        bst.put("H", 6);
        bst.put("M", 7);

        StdOut.println("BST初始化完成，包含以下键值对：");
        for (String key : bst.keys()) {
            StdOut.println(key + " -> " + bst.get(key));
        }

        // 测试命令行参数
        if (args.length < 1) {
            StdOut.println("请提供命令行参数，例如：min、max、floor、ceiling、select、rank、delete、deleteMin、deleteMax、keys");
            return;
        }

        String command = args[0];
        try {
            switch (command) {
                case "min":
                    StdOut.println("最小值: " + bst.min());
                    break;

                case "max":
                    StdOut.println("最大值: " + bst.max());
                    break;

                case "floor":
                    if (args.length < 2) {
                        StdOut.println("请提供参数，例如：floor <key>");
                        return;
                    }
                    String floorKey = args[1];
                    StdOut.println("小于等于 " + floorKey + " 的最大值: " + bst.floor(floorKey));
                    break;

                case "ceiling":
                    if (args.length < 2) {
                        StdOut.println("请提供参数，例如：ceiling <key>");
                        return;
                    }
                    String ceilingKey = args[1];
                    StdOut.println("大于等于 " + ceilingKey + " 的最小值: " + bst.ceiling(ceilingKey));
                    break;

                case "select":
                    if (args.length < 2) {
                        StdOut.println("请提供参数，例如：select <k>");
                        return;
                    }
                    int k = Integer.parseInt(args[1]);
                    StdOut.println("排名为 " + k + " 的键: " + bst.select(k));
                    break;

                case "rank":
                    if (args.length < 2) {
                        StdOut.println("请提供参数，例如：rank <key>");
                        return;
                    }
                    String rankKey = args[1];
                    StdOut.println("键 " + rankKey + " 的排名: " + bst.rank(rankKey));
                    break;

                case "delete":
                    if (args.length < 2) {
                        StdOut.println("请提供参数，例如：delete <key>");
                        return;
                    }
                    String deleteKey = args[1];
                    bst.delete(deleteKey);
                    StdOut.println("删除键 " + deleteKey + " 后的BST：");
                    for (String key : bst.keys()) {
                        StdOut.println(key + " -> " + bst.get(key));
                    }
                    break;

                case "deleteMin":
                    bst.deleteMin();
                    StdOut.println("删除最小键后BST中的键值对：");
                    for (String key : bst.keys()) {
                        StdOut.println(key + " -> " + bst.get(key));
                    }
                    break;

                case "deleteMax":
                    bst.deleteMax();
                    StdOut.println("删除最大键后BST中的键值对：");
                    for (String key : bst.keys()) {
                        StdOut.println(key + " -> " + bst.get(key));
                    }
                    break;

                case "keys":
                    StdOut.println("BST中的所有键值对：");
                    for (String key : bst.keys()) {
                        StdOut.println(key + " -> " + bst.get(key));
                    }
                    break;

                default:
                    StdOut.println("未知命令: " + command);
                    StdOut.println("可用命令：min、max、floor、ceiling、select、rank、delete、deleteMin、deleteMax、keys");
            }
        } catch (IllegalArgumentException e) {
            StdOut.println("非法参数: " + e.getMessage());
        } catch (Exception e) {
            StdOut.println("发生错误: ");
            e.printStackTrace();
        }
    }
}